#============================================
# #知识点 
# Stevens在文章中一共比较了五种IO Model:
# blocking IO 阻塞IO
# nonblocking IO 非阻塞IO
# IO multiplexing  I0多路复用
# signal driven IO 信号驱动I0
# asynchronous IO 异步IO
# 由signal driven I0 (信号驱动Io) 在实际中并不常用，所以主要介绍其余四种IO Model。

# #1)等待数据准备(Waiting for the data to be ready)
# #2)将数据从内核拷贝到进程中(Copying the data from the kernel to the process)

# 同步异步
# 阻塞非阻塞
# 常见的网络阻塞状态:
# accept
# recv
# recvfrom

#在服务端开设多进程或者多线程进程池线程池其实还是没有解决Io问题
# 该等的地方还是得等没有规避
# 只不过多个人等待的彼此互不干扰
#============================================
# 虽然非阻塞Io给你的感觉非常的牛逼
# 但是该模型会长时间 占用着CPU并且不干活让CPU不停的空转
# 我们实际应用中也不会考虑使用非阻塞Io模型
# 任何的技术点都有它存在的意义
# 实际应用或者是思想借鉴
#============================================
# 监管机制其实有很多
# select机制windows & linux都有
# poll机制   只在1inux有
# poll和select都可以监管多个对象但是poll监管的数量更多
# 上述select和poll机制其实都不是很完美当监管的对象特别多的时候
# 可能会出现极其大的延时响应

# epol1机制  只在linux有
# 它给每一个监管对象都绑定一个回调机制
# 一旦有响应回调机制立刻发起提醒
#============================================
import socket
import select
server=socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
server.setblocking(False)
read_list = [server,]

while True:
    r_List, w_list, x_list = select.select(read_list,[],[])
    for i in read_list: 
        # "针对不同的对象做不同的处理”
        if i is server:
            conn,addr = i.accept()
            #也应该添加到监管的队列中
            read_list.append(conn)
        else:
            res = i.recv(1024)
            if len(res) == 0:
                i. close()
                #将无效的监管对象移除
                read_list.remove(i)
                continue
            print(res)
            i. send(b'heiheiheiheihel')
#============================================



